Fix crash with theme resource file
authorAlexander Larsson <alexl@redhat.com>
Fri, 3 Feb 2012 15:37:54 +0000 (16:37 +0100)
committerAlexander Larsson <alexl@redhat.com>
Fri, 3 Feb 2012 15:37:54 +0000 (16:37 +0100)
The freeing the GResource in gtk_css_provider_reset caused problems
because it was called from gtk_css_provider_load_from_path() inside
gtk_css_provider_get_named(). We fix this by delaying the
setting of priv->resource until we successfully loaded the file.

gtk/gtkcssprovider.c

index 86b1c9cca13062b9770421a76b94a36ab1d3369e..a637eee52b94b83ef78d2fe8719a2030e9a01b2c 100644 (file)
@@ -2925,18 +2925,24 @@ gtk_css_provider_get_named (const gchar *name,
          resource_file = g_build_filename (dir, "gtk.gresource", NULL);
          resource = g_resource_load (resource_file, NULL);
          if (resource != NULL)
-           {
-             provider->priv->resource = resource;
-             g_resources_register (resource);
-           }
+           g_resources_register (resource);
 
           if (!gtk_css_provider_load_from_path (provider, path, NULL))
             {
+             if (resource != NULL)
+               {
+                 g_resources_unregister (resource);
+                 g_resource_unref (resource);
+               }
               g_object_unref (provider);
               provider = NULL;
             }
           else
-            g_hash_table_insert (themes, g_strdup (key), provider);
+           {
+             /* Only set this after load success, as load_from_path will clear it */
+             provider->priv->resource = resource;
+             g_hash_table_insert (themes, g_strdup (key), provider);
+           }
 
           g_free (path);
         }